home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -in_the_mag- / basics / amos / bsdsocket.lha / BSDSocket.amos / BSDSocket.amosSourceCode
AMOS Source Code  |  1998-02-28  |  5KB  |  193 lines

  1. '
  2. 'BSDSocket.library Procedures
  3. 'By Internext Software 
  4. 'If used, please credit me (John Bintz), as they were a pain in the neck 
  5. 'to figure out.  But, it beats Blocking, Synchronous, and Pokey TCP: 
  6. 'Access, eh?  (Sorry, Pietro!) 
  7. '
  8.  
  9. 'Open bsdsocket.library
  10. Procedure BSD_OPEN
  11. Lib Open 5,"bsdsocket.library",0
  12. End Proc
  13. 'Close bsdsocket.library 
  14. Procedure BSD_CLOSE
  15. Lib Close 5
  16. End Proc
  17.  
  18. 'Create New Socket 
  19. Procedure SOCK_NEW
  20. Dreg(0)=2
  21. Dreg(1)=1
  22. Dreg(2)=0
  23. WHICH=Lib Call(5,-$1E)
  24. End Proc[WHICH]
  25. 'Set Memory Address to Place Errors
  26. Procedure SOCK_ERR[VARADDR]
  27. Areg(0)=VARADDR
  28. Dreg(0)=4
  29. SUCCESS=Lib Call(5,-$A8)
  30. End Proc
  31.  
  32. 'Open A Server Socket on Your Machine at PORT (mymachine.com:PORT) 
  33. Procedure SOCK_OPENSERVER[SPORT]
  34.   Proc SOCK_NEW : SOCKET=Param
  35.   
  36.   SOCK_GETYOURHOST
  37.   A$=Param$+Chr$(0)
  38.   Areg(0)=Varptr(A$)
  39.   
  40.   HOSTINFO=Lib Call(5,-$D2)
  41.   HOSTADDRESS=Leek(Leek(Leek(HOSTINFO+16)))
  42.   
  43.   A$=Chr$(16)+Chr$(2)+ Extension_16_04EA(SPORT)+ Extension_16_04CE(HOSTADDRESS)+String$(Chr$(0),8)
  44.   
  45.   Dreg(0)=SOCKET
  46.   Areg(0)=Varptr(A$)
  47.   Dreg(1)=Len(A$)
  48.   BIND=Lib Call(5,-$24)
  49.   
  50.   Dreg(0)=SOCKET
  51.   Dreg(1)=1
  52.   LISTEN=Lib Call(5,-$2A)
  53.   SOCK_SETIO[SOCKET]
  54.   If BIND=-1
  55.     SOCK_CLOSE[SOCKET]
  56.     SOCKET=-1
  57.   End If 
  58. End Proc[SOCKET]
  59. 'Set Non-Blocking/Asynchronous IO
  60. Procedure SOCK_SETIO[SOCKET]
  61. IOC_FIONBIO=($80000000 or(4*65536) or 126 or(Asc("f")*256))
  62. IOC_FIOASYNC=($80000000 or(4*65536) or 125 or(Asc("f")*256))
  63.  
  64. NBIO=1
  65. Dreg(0)=SOCKET : Dreg(1)=IOC_FIONBIO : Areg(0)=Varptr(NBIO)
  66. NOBLOCK=Lib Call(5,-$72)
  67. NBIO=1
  68. Dreg(0)=SOCKET : Dreg(1)=IOC_FIOASYNC : Areg(0)=Varptr(NBIO)
  69. NOBLOCK=Lib Call(5,-$72)
  70. End Proc
  71. 'Connect to Another Computer (tcp://HOST$:SPORT/)
  72. Procedure SOCK_OPENCONNECTION[HOST$,SPORT]
  73.   Proc SOCK_NEW : SOCKET=Param
  74.   A$=HOST$+Chr$(0)
  75.   Areg(0)=Varptr(A$)
  76.   
  77.   HOSTINFO=Lib Call(5,-$D2)
  78.   HOSTADDRESS=Leek(Leek(Leek(HOSTINFO+16)))
  79.   A$=Chr$(16)+Chr$(2)+ Extension_16_04EA(SPORT)+ Extension_16_04CE(HOSTADDRESS)+String$(Chr$(0),8)
  80.   
  81.   Dreg(0)=SOCKET
  82.   Areg(0)=Varptr(A$)
  83.   Dreg(1)=Len(A$)
  84.   CONNECT=Lib Call(5,-$36)
  85.   SOCK_SETIO[SOCKET]
  86.   If CONNECT=-1
  87.     SOCK_CLOSE[SOCKET]
  88.     SOCKET=-1
  89.   End If 
  90. End Proc[SOCKET]
  91. 'Check Your Host Port for Connection and Create A New Socket If So 
  92. Procedure SOCK_CHECKHOSTPORT[SOCKET]
  93.   A$=String$(Chr$(0),200)
  94.   FINSIZE=64
  95.   Dreg(0)=SOCKET
  96.   Areg(0)=Varptr(A$)
  97.   Areg(1)=Varptr(FINSIZE)
  98.   NEWSOCKET=Lib Call(5,-$30)
  99.   SOCK_CONNURL= Extension_16_04DC(Mid$(A$,8,4))
  100. End Proc[NEWSOCKET]
  101.  
  102. 'Send A String to a Socket 
  103. Procedure SOCK_SENDSTRING[SOCKET,A$]
  104.   If SOCKET<>-1
  105.     Dreg(0)=SOCKET
  106.     Areg(0)=Varptr(A$)
  107.     Dreg(1)=Len(A$)
  108.     Dreg(2)=0
  109.     NBYTES=Lib Call(5,-$42)
  110.   End If 
  111. End Proc[NBYTES]
  112. 'Read A String from a Socket 
  113. Procedure SOCK_READSTRING[SOCKET,MXSIZE]
  114.   If SOCKET<>-1
  115.     A$=Space$(MXSIZE)
  116.     Dreg(0)=SOCKET
  117.     Areg(0)=Varptr(A$)
  118.     Dreg(1)=MXSIZE
  119.     Dreg(2)=0
  120.     NBYTES=Lib Call(5,-$4E)
  121.     If NBYTES>0
  122.       A$=Left$(A$,NBYTES)
  123.     Else 
  124.       A$=""
  125.     End If 
  126.   Else 
  127.     A$=""
  128.   End If 
  129. End Proc[A$]
  130. 'Send A Memory Buffer to a Socket
  131. Procedure SOCK_SEND[SOCKET,ADR,ADRLEN]
  132. Dreg(0)=SOCKET
  133. Areg(0)=ADR
  134. Dreg(1)=ADRLEN
  135. Dreg(2)=0
  136. NBYTES=Lib Call(5,-$42)
  137. End Proc[NBYTES]
  138. 'Read A Memory Buffer from a Socket
  139. Procedure SOCK_READ[SOCKET,ADR,ADRLEN]
  140. Dreg(0)=SOCKET
  141. Areg(0)=ADR
  142. Dreg(1)=ADRLEN
  143. Dreg(2)=0
  144. NBYTES=Lib Call(5,-$4E)
  145. End Proc[NBYTES]
  146.  
  147. 'Get Your Hostname (PPP) 
  148. Procedure SOCK_GETYOURHOST
  149. Open In 1,"env:hostname"
  150. A$=Input$(1,Lof(1)) : Close 1
  151. End Proc[A$]
  152.  
  153. 'Close A Socket (Save Memory)
  154. Procedure SOCK_CLOSE[SOCKET]
  155. If SOCKET<>-1
  156.   Dreg(0)=SOCKET
  157.   SUCCESS=Lib Call(5,-$78)
  158.   Print SUCCESS,SOCK_ERRNO
  159. End If 
  160. End Proc
  161.  
  162. 'These Commands are especially for FTP, which is weird...
  163.  
  164. 'Open An FTP Connection (ftp://HOST$:SPORT/) 
  165. Procedure FTP_OPENCONNECTION[HOST$,SPORT]
  166. Shared _FTP_HOSTSOCK,_FTP_YOURSOCK,_FTP_YOURPORT$
  167. SOCK_OPENCONNECTION[HOST$,SPORT] : _FTP_HOSTSOCK=Param
  168. SOCK_OPENSERVER[5000] : _FTP_YOURSOCK=Param
  169. P$="" : H$=Mid$(Hex$(HOSTADDRESS,8),2)
  170. For I=0 To 3
  171.   P$=P$+Str$(Val("$"+Mid$(H$,I*2+1,2)))+","
  172. Next 
  173. P$=P$-" "
  174. _FTP_YOURPORT$="PORT "+P$+"19,136"+Chr$(13)+Chr$(10)
  175. End Proc
  176. 'Grab Host Socket ID 
  177. Procedure FTP_HOSTSOCK
  178. Shared _FTP_HOSTSOCK
  179. End Proc[_FTP_HOSTSOCK]
  180. 'Grab Your Socket ID 
  181. Procedure FTP_YOURSOCK
  182. Shared _FTP_YOURSOCK
  183. End Proc[_FTP_YOURSOCK]
  184. 'Grab PORT String (used to send files via FTP) 
  185. Procedure FTP_YOURPORT$
  186. Shared _FTP_YOURPORT$
  187. End Proc[_FTP_YOURPORT$]
  188. 'Close an FTP Connection 
  189. Procedure FTP_CLOSECONNECTION
  190. Shared _FTP_HOSTSOCK,_FTP_YOURSOCK
  191. SOCK_CLOSE[_FTP_HOSTSOCK]
  192. SOCK_CLOSE[_FTP_YOURSOCK]
  193. End Proc